package com.shixu.framework.plugins.weixin.service;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import net.sf.json.JSONObject;

import org.apache.commons.lang.StringUtils;

/**
 * 上传下载多媒体文件
 * @author luy
 *
 */
public class MediaService {

	/** 媒体文件类型，图片（image） */
	public static final String IMAGE = "image";
	/** 媒体文件类型，语音（voice） */
	public static final String VOICE = "voice";
	/** 媒体文件类型，视频（video） */
	public static final String VIDEO = "video";
	/** 媒体文件类型，缩略图（thumb） */
	public static final String THUMB = "thumb";
	
	// 上传多媒体文件
	public final String MEDIA_UPLOAD_URI = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=";
	
	/**
		* 上传多媒体文件到微信公众平台
		* @param type 媒体文件类型，分别有图片（image）、语音（voice）、视频（video）和缩略图（thumb）(eg:Media.IMAGE)
		* @param access_token //在微信平台获取到的凭证
		* @param filePath 文件路径(eg:D:/1.jpg)
		* @return
		* @throws IOException 
	*/
	public JSONObject uploadmedia(String type,String access_token, String filePath) throws IOException{
		
		String requestUrl = MEDIA_UPLOAD_URI + access_token + "&type=" + type;
		
		String result = null;  
		  
	    File file = new File(filePath);  
	    if (!file.exists() || !file.isFile()) {  
	    	throw new IOException("文件不存在");  
	    }  
	  
	    /** 
	    * 第一部分 
	    */  
	    URL urlObj = new URL(requestUrl);  
	    // 连接  
	    HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();  
	  
	    /** 
	    * 设置关键值 
	    */  
	    con.setRequestMethod("POST"); // 以Post方式提交表单，默认get方式  
	    con.setDoInput(true);  
	    con.setDoOutput(true);  
	    con.setUseCaches(false); // post方式不能使用缓存  
	  
	    // 设置请求头信息  
	    con.setRequestProperty("Connection", "Keep-Alive");  
	    con.setRequestProperty("Charset", "UTF-8");  
	  
	    // 设置边界  
	    String BOUNDARY = "----------" + System.currentTimeMillis();  
	    con.setRequestProperty("Content-Type", "multipart/form-data; boundary="+ BOUNDARY);  
	  
	    // 请求正文信息  
	  
	    // 第一部分：  
	    StringBuilder sb = new StringBuilder();  
	    sb.append("--"); // 必须多两道线  
	    sb.append(BOUNDARY);  
	    sb.append("\r\n");  
	    sb.append("Content-Disposition: form-data;name=\"file\";filename=\"" + file.getName() + "\"\r\n");  
	    sb.append("Content-Type:application/octet-stream\r\n\r\n");  
	  
	    byte[] head = sb.toString().getBytes("utf-8");  
	  
	    // 获得输出流  
	    OutputStream out = new DataOutputStream(con.getOutputStream());  
	    // 输出表头  
	    out.write(head);  
	  
	    // 文件正文部分  
	    // 把文件已流文件的方式 推入到url中  
	    DataInputStream in = new DataInputStream(new FileInputStream(file));  
	    int bytes = 0;  
	    byte[] bufferOut = new byte[1024];  
	    while ((bytes = in.read(bufferOut)) != -1) {  
	    out.write(bufferOut, 0, bytes);  
	    }  
	    in.close();  
	  
	    // 结尾部分  
	    byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线  
	  
	    out.write(foot);  
	  
	    out.flush();  
	    out.close();  
	  
	    StringBuffer buffer = new StringBuffer();  
	    BufferedReader reader = null;  
	    try {  
		    // 定义BufferedReader输入流来读取URL的响应  
		    reader = new BufferedReader(new InputStreamReader(con.getInputStream()));  
		    String line = null;  
		    while ((line = reader.readLine()) != null) {  
			    //System.out.println(line);  
			    buffer.append(line);  
		    }  
		    if(result==null){  
		    	result = buffer.toString();  
		    }  
	    } catch (IOException e) {  
		    System.out.println("发送POST请求出现异常！" + e);  
		    e.printStackTrace();  
		    throw new IOException("数据读取异常");  
	    } finally {  
		    if(reader!=null){  
		    reader.close();  
		    }  
	    }  
	    if(StringUtils.isNotEmpty(result)){
    		return JSONObject.fromObject(result);
    	}
        return null; 
	}
	  

	/**
	 * 测试上传媒体接口
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {  
	    String filePath = "D:/1.jpg";  
	    String result = null;  
	    MediaService media = new MediaService(); 
	    String access_token = "SoZRv2eaiMSmX80KQ9OLTYBWgVCfOrZe0WsdgzKxXOm-jfXaKw0FNh5tSUrxSuHIFeAc51SEeKKeV4m9G4vkMxOo6pPQP5PDkCVj6kDfOzg";
	    result = media.uploadmedia(MediaService.IMAGE, access_token, filePath).toString();
	    System.out.println(result);  
	  
	}  

}
